package com.example.basic.web.service.parameter.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.basic.base.impl.BaseEntityServiceImpl;
import com.example.basic.exception.ServiceException;
import com.example.basic.web.mapper.parameter.ParameterMapper;
import com.example.basic.web.model.parameter.Parameter;
import com.example.basic.web.service.parameter.ParameterService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

import static com.example.basic.utils.CheckUtil.notNull;

/**
 * <p>
 * 全局参数表 服务实现类
 * </p>
 *
 * @author zhangzq
 * @since 2023-12-08
 */
@Service
@Transactional
public class ParameterServiceImpl extends BaseEntityServiceImpl<ParameterMapper, Parameter> implements ParameterService {

    @Resource
    private ParameterMapper parameterMapper;

    /**
     * 新增或修改 zq
     * @param parameter 参数实体
     * @return
     */
    @Override
    public Parameter saveOrUpdate(Parameter parameter) {
        checkParams(parameter);

        //判断参数名是否重复
        LambdaQueryWrapper<Parameter> lqw = new LambdaQueryWrapper<>();
        lqw.eq(Parameter::getParamName,parameter.getParamName());
        if(parameter.getId() != null){
            lqw.ne(Parameter::getId,parameter.getId());
        }
        Parameter localParameter = this.parameterMapper.selectOne(lqw);
        if(localParameter != null){
            throw new ServiceException("参数名不能重复");
        }

        if(parameter.getId() != null){
            preUpdate(parameter);
        }else{
            preCreate(parameter);
        }
        if( this.save(parameter) > 0){
            return this.selectById(parameter.getId());
        }
        throw new ServiceException("全局参数维护失败");
    }

    /**
     * 删除 zq
     * @param id 唯一id
     * @return
     */
    @Override
    public boolean delete(String id) {
        notNull(id,"全局参数ID不能为空");

        //查询数据是否存在
        Parameter localParameter = this.selectById(id);
        if(localParameter == null){
            throw new ServiceException("未查询到当前数据");
        }

        if(this.deleteById(id) > 0){
            return true;
        }
        throw new ServiceException("全局参数删除失败");
    }

    /**
     * 根据参数名查询参数值 zq
     * @param paramName 参数名
     * @return
     */
    @Override
    public Parameter getTransValueByName(String paramName) {
        notNull(paramName,"全局参数名称不能为空");

        LambdaQueryWrapper<Parameter> lqw = new LambdaQueryWrapper<>();
        lqw.eq(Parameter::getParamName,paramName);
        Parameter parameter = this.parameterMapper.selectOne(lqw);
        if(parameter != null){
            return parameter;
        }
        throw new ServiceException("未查询到当前数据");
    }
    /**
     * 列表(分页,没有筛选条件) zq
     * @param searchParam 模糊搜索
     * @return
     */
    @Override
    public IPage<Parameter> queryList(Page<Parameter> queryPage, String searchParam) {
        return parameterMapper.queryList(queryPage, searchParam);
    }

    /**
     * 校验参数 zq
     * @param parameter 参数实体
     */
    private void checkParams(Parameter parameter) {
        notNull(parameter,"全局参数模型不能为空");
        notNull(parameter.getParamName(),"全局参数名称不能为空");
    }
}